﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BusinessLayer.Model.Entities;

namespace BusinessLayer.Model.Repositories.Abstract
{
    /// <summary>
    /// Interface que define los metodos que debe implementar el repositorio de eventos
    /// </summary>
    public interface IEventRepository
    {
        /// <summary>
        /// Devuelve un evento que concuerda con el Id especificado
        /// </summary>
        /// <param name="id">Id del evento</param>
        /// <returns>Evento</returns>
        Event              FetchByID(Guid id);

        /// <summary>
        /// Devuelve una lista de todos los eventos existentes en el repositorio
        /// </summary>
        /// <returns>Lista de eventos</returns>
        IEnumerable<Event> FetchAll();

        /// <summary>
        /// Devuelve los ultimos N eventos del repositorio
        /// </summary>
        /// <param name="amount">Cantidad de eventos a devolver</param>
        /// <returns>Lista de los ultimos N eventos</returns>
        IEnumerable<Event> FetchLastEvents(int amount);

        /// <summary>
        /// Inserta un evento al repositorio
        /// </summary>
        /// <param name="e">evento a insertar</param>
        void               InsertOnSubmit(Event e);

        /// <summary>
        /// Inserta un evento al repositorio
        /// </summary>
        /// <param name="title">Título del evento</param>
        /// <param name="description">Descripción del evento</param>
        /// <param name="place">Lugar del evento</param>
        /// <param name="date">Fecha del evento</param>
        void               InsertOnSubmit(string title, string description, string place, DateTime date);

        /// <summary>
        /// Actualiza un evento en el repositorio
        /// </summary>
        /// <param name="e">Evento a actualizar</param>
        void               UpdateOnSubmit(Event e);

        /// <summary>
        /// Borra un evento del repositorio
        /// </summary>
        /// <param name="e">Evento a borrar</param>
        void               DeleteOnSubmit(Event e);

        /// <summary>
        /// Guarda los cambios hechos al repositorio
        /// </summary>
        void               SubmitChanges();
    }
}
